package com.labot.dao.hibernate;

import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.labot.dao.EnvioDao;
import com.labot.dao.RoleDao;
import com.labot.model.Centro;
import com.labot.model.Envio;
import com.labot.model.EnvioBitacora;
import com.labot.model.Role;
import com.labot.util.DateUtil;


/**
 * This class interacts with hibernate session to save/delete and
 * retrieve Role objects.
 *
 * @author <a href="mailto:bwnoll@gmail.com">Bryan Noll</a>
 * @author jgarcia (updated to hibernate 4)
 */
@Repository("envioDao")
public class EnvioDaoHibernate extends GenericDaoHibernate<Envio, Long> implements EnvioDao {

    /**
     * Constructor to create a Generics-based version using Role as the entity
     */
    public EnvioDaoHibernate() {
        super(Envio.class);
    }

    /**
     * {@inheritDoc}
     */

	@SuppressWarnings("unchecked")
	@Override
	public List<Envio> getEnviosbyCentro(Long id) throws Exception {
		Query qry = getSession().createQuery("from Envio e WHERE e.centro.id = :id order by e.fecha desc");
		qry.setParameter("id", id);
        return (List<Envio>) qry.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Envio> getEnviosporRango(Date fechadesde, Date fechahasta) {
		
		String query = "";
		
		if(fechadesde == null && fechahasta!=null)
			query = "from Envio e WHERE e.fecha <= :hasta order by e.fecha desc";
		if(fechadesde != null && fechahasta==null)
			query = "from Envio e WHERE e.fecha >= :desde order by e.fecha desc";
		if(fechadesde == null && fechahasta==null)
			query = "from Envio e order by e.fecha desc";
		if(fechadesde!=null && fechahasta!=null)
			query = "from Envio e WHERE e.fecha >= :desde AND e.fecha <= :hasta order by e.fecha desc";
		
		Query qry = getSession().createQuery(query);
		if(fechadesde!= null)
		qry.setParameter("desde", fechadesde);
		if(fechahasta!=null)
		qry.setParameter("hasta", fechahasta);
        return (List<Envio>) qry.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Envio> getEnvios() {
		Query qry = getSession().createQuery("from Envio e order by e.fecha desc");
		return (List<Envio>) qry.list();
	}

	@Override
	public Envio saveEnvio(Envio envio) {
		super.save(envio);
        getSession().flush();
        return envio;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<EnvioBitacora> getBitacoras(Long idEnvio) {
		Query qry = getSession().createQuery("from BitacoraEnvio b WHERE b.idEnvio >= :idEnvio order by upper(b.fecha)");
		qry.setParameter(":idEnvio", idEnvio);
		return (List<EnvioBitacora>) qry.list();
	}

	@Override
	public Envio buscarEnvio(Long id) {
		Query qry= getSession().createQuery("from Envio e WHERE e.id = :id");
		qry.setParameter("id", id);
		return (Envio) qry.uniqueResult();
	}
}
